import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.Arrays;

/**
 * @ClassName CodeGeneratorMain
 * @Description TODO
 * @Author 王玉星
 * @Date 2021/7/31 12:07
 * @Version 1.0
 */
public class CodeGeneratorMain {
    public static void main(String[] args) {
        //配置代码生成器对象
        AutoGenerator generator = new AutoGenerator();
        // 配置策略
        // 1、全局配置
        GlobalConfig gc = new GlobalConfig();
        //获取当前项目路径
        String projectPath = System.getProperty("user.dir");
        //生成代码路径 等于当前项目路径+模块路径+/src/main/java
        gc.setOutputDir(projectPath + "/Service-Provider-Main-9110/src/main/java");
        gc.setAuthor("王玉星");        //作者信息
        gc.setOpen(false);      //是否打开资源管理器
        gc.setFileOverride(false);  //生成文件是否覆盖
        gc.setSwagger2(true);      //实体属性 Swagger2 注解
        //去掉Services实现类的I前缀,并在名字后面加上Impl
        gc.setServiceImplName("%sServiceImpl");
        //去掉Service接口的I前缀
        gc.setServiceName("%sService");
        gc.setIdType(IdType.ASSIGN_ID);     //主键生成策略
        gc.setDateType(DateType.ONLY_DATE);     //设置时间类型
        //将全局配置放入代码生成器对象中
        generator.setGlobalConfig(gc);

        // 2、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        //连接url
        dsc.setUrl("jdbc:mysql://47.97.218.81:3306/Security_JWT?useSSL=true&useUnicode=true&charterEncoding=utf8&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");    //连接驱动
        dsc.setUsername("root");      //连接名称
        dsc.setPassword("970699");      //连接密码
        dsc.setDbType(DbType.MYSQL);        //连接数据库类型
        //将数据源配置放入代码生成器对象中
        generator.setDataSource(dsc);

        // 3、包配置
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName("CodeGenerator");  //生成的模块
        pc.setParent("");        //生成的父路径设置为空
        String classParentPath = "com.wyx.";    // 设置类的父路径
        String fileParentPath = "";    // 设置配置文件的父路径
        pc.setEntity(classParentPath+"pojo");       //实体类包
        pc.setService(classParentPath+ "service");   //service层包
        pc.setController(classParentPath+"controller");     //controller 层包
        pc.setMapper(classParentPath+ "mapper");     //mapper 层包
        pc.setServiceImpl(classParentPath+"service.impl");   //ServiceImpl层包
        pc.setXml(fileParentPath+ "mapper");
        //将生成包规则放入代码生成器对象中
        generator.setPackageInfo(pc);

        // 4、配置策略
        StrategyConfig strategy = new StrategyConfig();
        //设置要映射的表，看数据库的表来(最重要)，多张数据库表逗号来传递多个表名
        strategy.setInclude("jwt_user","jwt_role","jwt_user_role");
        strategy.setTablePrefix("jwt_");          // 移除表前缀
//        strategy.setFieldPrefix("role_");          // 移除字段前缀
        strategy.setNaming(NamingStrategy.underline_to_camel);      //设置命名规则 下划线转驼峰命名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);    //设置命名规则
        strategy.setEntityLombokModel(true);        //自动使用Lombok
        //逻辑删除策略 的字段名
        strategy.setLogicDeleteFieldName("deleted");
        // 自动填充配置
        TableFill createTime = new TableFill("create_time", FieldFill.INSERT);      //自动填充策略配置
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);   //自动更新策略配置
        strategy.setTableFillList(Arrays.asList(createTime,updateTime));
        //乐观锁
        strategy.setVersionFieldName("version");    //设置乐观锁
        //生成 @RestController 控制器 @Controller -> @RestController
        strategy.setRestControllerStyle(true);
        //驼峰转连字符 @RequestMapping("/managerUserActionHistory") -> @RequestMapping("/manager-user-action-history")
        strategy.setControllerMappingHyphenStyle(true);
        //将配置的策略放入代码生成器对象中
        generator.setStrategy(strategy);

        generator.execute();  //执行代码生成器方法
        
    }
}